package Interface;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener,MouseListener {
    Random ra=new Random();
    //java中表示界面,窗体
    //创建一个二维数组
    int[][] newTemArr=new int[4][4];
    //记录空白去区域的位置
    int x =0;
    int y= 0;
    //定义一个计步器
    int count=0;
    //定义一个变量展示当前展示图片的路径
    String path="..\\Game\\image\\animal\\animal3\\";

    //创建功能里面的(重新开始 重新登录 关闭游戏 条目)
    JMenuItem replayGameItem=new JMenuItem("重新游戏");
    JMenuItem replayLonginItem=new JMenuItem("重新登录");
    JMenuItem closeGameItem=new JMenuItem("关闭游戏");
    //创建更换图片的3个条目
    JMenuItem prettyGirlItem=new JMenuItem("美女");
    JMenuItem animaItem=new JMenuItem("动物");
    JMenuItem sportItem=new JMenuItem("运动");
    JMenuItem accountItem=new JMenuItem("公众号");
    //构造空参方法,对页面进行初始化
    public GameJFrame(){
        //初始化界面
        initJFramer();

        //初始化菜单
        initJMenuBar();

        //初始化数据(打乱),根据打乱之后的结果加载图片
        initDate();


        //初始化图片
        initImage();

        //设置显示界面
        this.setVisible(true);
    }

    private void initDate() {
        int[] tempArr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        //1.打乱一维数组
        Random ra=new Random();
        for (int i = 0; i < tempArr.length; i++) {
            int flag=ra.nextInt(tempArr.length);
            //定义一个临时第三方存储变量
            int tep=tempArr[i];
            tempArr[i]=tempArr[flag];
            tempArr[flag]=tep;
        }
        //2.把数字放进二维数组中
        //定义一个计数器
        int number=0;
        for (int i = 0; i < newTemArr.length; i++) {
            for (int i1 = 0; i1 < newTemArr[i].length; i1++) {
                //记录0元素的位置
                if(tempArr[number]==0){
                    x=i1;
                    y=i;
                }
                newTemArr[i][i1]=tempArr[number];
                number++;
            }
        }
    }

    private void initImage() {
        //创建一个图片的ImageIcon类
//        ImageIcon icon=new ImageIcon("D:\\javastudy\\Game\\image\\animal\\animal3\\1.jpg");

        //创建一个JLabel的对象(管理容器)
//        JLabel jLabel=new JLabel(icon);
        //指定图片的位置
//        jLabel.setBounds(0,0,105,105);
        //把管理容器放进JFrame中,先获取到了里面的隐藏的空间(空白的空间)在添加到空白空间.
//        this.getContentPane().add(jLabel);


        //清楚原来的图片
        this.getContentPane().removeAll();

        //判断游戏是否胜利
        boolean flag=isWin();
        System.out.println(flag);
        if (flag){
            //添加获取的图片
            JLabel yes=new JLabel(new ImageIcon("..\\Game\\image\\win.png"));
            //设置胜利图片的位置和高宽
            yes.setBounds(203,283,197,73);
            //添加到页面中
            this.getContentPane().add(yes);
        }

        //添加计步器
        JLabel stepCount=new JLabel("步数:"+count);
        //设置计步器的位置
        stepCount.setBounds(50,30,100,20);
        //添加计步器到页面中
        this.getContentPane().add(stepCount);

        //利用循环添加图片到页面中第一,二 三四排,通过二维数组进行打乱添加
        for (int i = 0; i < newTemArr.length; i++) {
            for (int i1 = 0; i1 < newTemArr[i].length; i1++) {
                //获取二维数组的序号
                int number=newTemArr[i][i1];
                //创建一个JLabel的对象(管理容器)
                JLabel jLabel = new JLabel(new ImageIcon(path + number + ".jpg"));
                //指定图片的位置
                jLabel.setBounds(105*i1+83,105*i+134,105,105);
                //给图片添加边框
                //0:表示凸起来
                //1:凹下去
                jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
                //把管理容器放进JFrame中,先获取到了里面的隐藏的空间(空白的空间)在添加到空白空间.
                this.getContentPane().add(jLabel);
            }
        }

        //创建图片管理器,并添加进背景图片
        JLabel bg=new JLabel(new ImageIcon("image\\background.png"));
        //设置图片的位置和宽高
        bg.setBounds(40,40,508,560);
        //添加背景图片到页面中
        this.getContentPane().add(bg);

        //刷新一下界面getContentPane().repaint()
        this.getContentPane().repaint();

    }

    //定义一个方法判断win数组是否和newTemArr数组相同
    private boolean isWin() {
        int[][] win={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};
        for (int i = 0; i < win.length; i++) {
            for (int i1 = 0; i1 < win[i].length; i1++) {
                if (win[i][i1]!=newTemArr[i][i1]){return false;}
            }
        }
        return true;
    }

    private void initJMenuBar() {
        //创建整个菜单对象
        JMenuBar jMenuBar=new JMenuBar();

        //创建菜单界面的两个选项对象(功能 关于我们)
        JMenu functionJMenu=new JMenu("功能");
        JMenu weJMenu=new JMenu("关于我们");
        //创建在功能里面的更换图片的选项
        JMenu changeJMenu=new JMenu("更换图片");

        //给功能的每个条目绑定事件
        replayGameItem.addMouseListener(this);
        replayLonginItem.addMouseListener(this);
        closeGameItem.addMouseListener(this);
        accountItem.addMouseListener(this);
        prettyGirlItem.addMouseListener(this);
        animaItem.addMouseListener(this);
        sportItem.addMouseListener(this);
        //将每一个选项下面的条目添加到对应的选项中
        //添加更换图片到功能
        functionJMenu.add(changeJMenu);
        //给更换图片添加,美女 动物 运动的条目
        changeJMenu.add(prettyGirlItem);
        changeJMenu.add(animaItem);
        changeJMenu.add(sportItem);

        functionJMenu.add(replayGameItem);
        functionJMenu.add(replayLonginItem);
        functionJMenu.add(closeGameItem);
        weJMenu.add(accountItem);

        //添加对应的选项到菜单当中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(weJMenu);

        //给整个界面设置菜单---->相当于是把写好的菜单放进继承的JMenuFrane中.
        this.setJMenuBar(jMenuBar);
    }

    private void initJFramer() {
        //设置界面的宽度和高度
        this.setSize(603,680);
        //设置界面标题
        this.setTitle("拼图小游戏");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置默认的关闭方式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        //取消默认的居中放置,只有取消了才会按照XY轴的形式添加组件.
        this.setLayout(null);

        //给整个页面添加键盘监听
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    //按下不松
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode==83){
            //把界面中的所有的图片都删除
            this.getContentPane().removeAll();
            //创建图片管理容器添加图片
            JLabel jLabel=new JLabel(new ImageIcon(path+"all.jpg"));
            //设置图片的位置和宽高
            jLabel.setBounds(83,134,420,420);
            //添加完整的图片
            this.getContentPane().add(jLabel);
            //创建图片管理器,并添加进背景图片
            JLabel bg=new JLabel(new ImageIcon("..\\Game\\image\\background.png"));
            //设置图片的位置和宽高
            bg.setBounds(40,40,508,560);
            //添加背景图片到页面中
            this.getContentPane().add(bg);
            //刷新页面
            this.getContentPane().repaint();

        }
    }

    @Override
    //松开按键
    public void keyReleased(KeyEvent e) {
        //判断游戏是否胜利如果胜利直接结束游戏,按键,不能在执行
        if (isWin()){return;}
        int keyCode = e.getKeyCode();           //37⬅️38⬆️39➡️40⬇️
        if (keyCode == 37) {
            //如果移动已经到达了边界,则直接结束,不执行
            if (x == 3) {
                return;
            }
            //左移动：是把空白区域右方的图片左移。
            //定义一个临时储存器
            int tem = newTemArr[y][x];
            newTemArr[y][x] = newTemArr[y][x + 1];
            newTemArr[y][x + 1] = tem;
            //记录当前空白区域的值
            x++;
            System.out.println("向左移动");
            //重新加载图片
            count++;
            initImage();
        } else if (keyCode == 38) {
            if (y == 3) {
                return;
            }
            System.out.println("向上移动");
            //定义一个临时储存器
            //是把空白区域下方的图片上移
            int tem = newTemArr[y][x];
            newTemArr[y][x] = newTemArr[y + 1][x];
            newTemArr[y + 1][x] = tem;
            y++;
            count++;
            //重新加载图片
            initImage();
        } else if (keyCode == 39) {
            System.out.println("向右移动");
            if (x == 0) {
                return;
            }
            //是把空白区域左方的图片右移
            int tem = newTemArr[y][x];
            newTemArr[y][x] = newTemArr[y][x - 1];
            newTemArr[y][x - 1] = tem;
            x--;
            //重新加载图片
            count++;
            initImage();
        } else if (keyCode == 40) {
            if (y == 0) {
                return;
            }
            System.out.println("向下移动");
            //是把空白区域上方的图片下移
            int tem = newTemArr[y][x];
            newTemArr[y][x] = newTemArr[y - 1][x];
            newTemArr[y - 1][x] = tem;
            y--;
            //重新加载图片
            count++;
            initImage();
        } else if (keyCode == 83) {
            initImage();
        }//作弊码
        else if (keyCode == 89) {
            //定义一个显示的完整的二维数组
            //重新定义newTemArr这个二维数组,new int[][] 的意思是声明这是个二维二维数组,后面在进行二维数组的赋值.
            newTemArr = new int[][]{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 0}};
            initImage();
        }
    }

    @Override
    //鼠标单击
    public void mouseClicked(MouseEvent e) {

    }

    @Override
    public void mousePressed(MouseEvent e) {
        Object source = e.getSource();
        if (source==replayGameItem) {
            System.out.println("重新游戏");
            //重新打乱数组
            initDate();
            //重新加载页面
            initImage();
            //计数器清零
            count=0;
        }else if (source==replayLonginItem){
            System.out.println("重新登录");
            //关闭当前游戏界面，打开登录界面
            this.setVisible(false);
            new LoginKJFrame();
        } else if (source==closeGameItem) {
            System.out.println("关闭游戏");
            this.setVisible(false);
        }else if (source==accountItem){
            //创建弹框对象
            JDialog jDialog=new JDialog();
            //创建管理容器的对象JLabel
            JLabel jLabel=new JLabel(new ImageIcon("..\\Game\\image\\damie.jpg"));
            //设置图片的位置和宽高，位置是相对与弹框的
            jLabel.setBounds(0,0,99,100);
            //添加图片到弹框,在JDialog中也有一个隐藏的容器
            jDialog.getContentPane().add(jLabel);
            //给弹框设置大小
            jDialog.setSize(244,244);
            //让弹框置顶
            jDialog.setAlwaysOnTop(true);
            //让弹框据居中,取消原有的位置,默认放置在中间
            jDialog.setLocationRelativeTo(null);
            //弹框不关闭则无法操作下面的界面
            jDialog.setModal(true);
            //让弹框显示出来
            jDialog.setVisible(true);
        } else if (source==prettyGirlItem) {
            int phoneNumber=ra.nextInt(13)+1;
            //更改图片路径
            path="..\\Game\\image\\girl\\girl"+phoneNumber+"\\";
            //清空计步器
            count=0;
            //重新打乱数组
            initDate();
            //重新加载图片
            initImage();
        } else if (source==animaItem) {
            System.out.println("更换动物图片");
            int phoneNumber=ra.nextInt(8)+1;
            //更改图片路径
            path="..\\Game\\image\\animal\\animal"+phoneNumber+"\\";
            //清空计步器
            count=0;
            //重新打乱数组
            initDate();
            //重新加载图片
            initImage();
        } else if (source==sportItem) {
            System.out.println("更换运动图片");
            int phoneNumber=ra.nextInt(10)+1;
            //更改图片路径
            path="..\\Game\\image\\sport\\sport"+phoneNumber+"\\";
            //清空计步器
            count=0;
            //重新打乱数组
            initDate();
            //重新加载图片
            initImage();
        }
    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {
    }
}
